From dda6a0d385852ca93badfe4cac02e1e4ae247b09 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Tue, 7 Jun 2016 16:34:50 +0100 Subject: [PATCH] Associate the drawing context to the Cairo context Instead of associating the GdkWindow that created the GdkDrawingContext we can directly bind the Cairo context to the GDK drawing context. Cairo contexts created via gdk_cairo_create() go back to not having a GdkWindow associated to them, like they did before we introduced the gdk_window_begin_draw_frame() API. https://bugzilla.gnome.org/show_bug.cgi?id=766675 --- docs/reference/gdk/gdk3-sections.txt | 2 +- gdk/gdkcairo.h | 6 ++++-- gdk/gdkdrawingcontext.c | 31 ++++++++++++++++++++++++++++ gdk/gdkwindow.c | 29 -------------------------- gtk/gtkwidget.c | 29 ++++++++++++++++---------- 5 files changed, 54 insertions(+), 43 deletions(-) diff --git a/docs/reference/gdk/gdk3-sections.txt b/docs/reference/gdk/gdk3-sections.txt index f3e005ab06..b0fa61f4e4 100644 --- a/docs/reference/gdk/gdk3-sections.txt +++ b/docs/reference/gdk/gdk3-sections.txt @@ -625,7 +625,7 @@ gdk_window_create_similar_surface gdk_window_create_similar_image_surface gdk_cairo_create gdk_cairo_get_clip_rectangle -gdk_cairo_get_window +gdk_cairo_get_drawing_context gdk_cairo_set_source_color gdk_cairo_set_source_rgba gdk_cairo_set_source_pixbuf diff --git a/gdk/gdkcairo.h b/gdk/gdkcairo.h index 4d8d2235ff..6cd50aacac 100644 --- a/gdk/gdkcairo.h +++ b/gdk/gdkcairo.h @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -32,8 +33,7 @@ G_BEGIN_DECLS GDK_AVAILABLE_IN_ALL cairo_t * gdk_cairo_create (GdkWindow *window); -GDK_AVAILABLE_IN_3_22 -GdkWindow * gdk_cairo_get_window (cairo_t *cr); + GDK_AVAILABLE_IN_ALL gboolean gdk_cairo_get_clip_rectangle (cairo_t *cr, GdkRectangle *rect); @@ -83,6 +83,8 @@ void gdk_cairo_draw_from_gl (cairo_t *cr, int width, int height); +GDK_AVAILABLE_IN_3_22 +GdkDrawingContext * gdk_cairo_get_drawing_context (cairo_t *cr); G_END_DECLS diff --git a/gdk/gdkdrawingcontext.c b/gdk/gdkdrawingcontext.c index caffa0cf48..6216bab20e 100644 --- a/gdk/gdkdrawingcontext.c +++ b/gdk/gdkdrawingcontext.c @@ -178,6 +178,34 @@ gdk_drawing_context_init (GdkDrawingContext *self) { } +static const cairo_user_data_key_t draw_context_key; + +static void +gdk_cairo_set_drawing_context (cairo_t *cr, + GdkDrawingContext *context) +{ + cairo_set_user_data (cr, &draw_context_key, context, NULL); +} + +/** + * gdk_cairo_get_drawing_context: + * @cr: a Cairo context + * + * Retrieves the #GdkDrawingContext that created the Cairo + * context @cr. + * + * Returns: (transfer none) (nullable): a #GdkDrawingContext, if any is set + * + * Since: 3.22 + */ +GdkDrawingContext * +gdk_cairo_get_drawing_context (cairo_t *cr) +{ + g_return_val_if_fail (cr != NULL, NULL); + + return cairo_get_user_data (cr, &draw_context_key); +} + /** * gdk_drawing_context_get_cairo_context: * @context: @@ -204,6 +232,9 @@ gdk_drawing_context_get_cairo_context (GdkDrawingContext *context) if (context->cr == NULL) { context->cr = gdk_cairo_create (context->window); + + gdk_cairo_set_drawing_context (context->cr, context); + gdk_cairo_region (context->cr, context->clip); cairo_clip (context->cr); } diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c index 4724f3fa9f..0f3e222811 100644 --- a/gdk/gdkwindow.c +++ b/gdk/gdkwindow.c @@ -3111,33 +3111,6 @@ gdk_window_begin_paint_region (GdkWindow *window, gdk_window_begin_paint_internal (window, region); } -static const cairo_user_data_key_t draw_context_window_key; - -static void -gdk_cairo_set_window (cairo_t *cr, - GdkWindow *window) -{ - cairo_set_user_data (cr, &draw_context_window_key, window, NULL); -} - -/** - * gdk_cairo_get_window: - * @cr: a Cairo context created by gdk_window_begin_draw_frame() - * - * Retrieves the #GdkWindow that created the Cairo context @cr. - * - * Returns: (nullable) (transfer none): a #GdkWindow - * - * Since: 3.22 - */ -GdkWindow * -gdk_cairo_get_window (cairo_t *cr) -{ - g_return_val_if_fail (cr != NULL, NULL); - - return cairo_get_user_data (cr, &draw_context_window_key); -} - /** * gdk_window_begin_draw_frame: * @window: a #GdkWindow @@ -3541,8 +3514,6 @@ gdk_cairo_create (GdkWindow *window) cr = cairo_create (surface); - gdk_cairo_set_window (cr, window); - if (window->impl_window->current_paint.region != NULL) { region = cairo_region_copy (window->impl_window->current_paint.region); diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 158e656852..313a425c88 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -6925,6 +6925,7 @@ gboolean gtk_cairo_should_draw_window (cairo_t *cr, GdkWindow *window) { + GdkDrawingContext *context; GdkWindow *tmp; g_return_val_if_fail (cr != NULL, FALSE); @@ -6933,8 +6934,11 @@ gtk_cairo_should_draw_window (cairo_t *cr, if (gtk_cairo_is_marked_for_draw (cr)) return TRUE; - tmp = gdk_cairo_get_window (cr); + context = gdk_cairo_get_drawing_context (cr); + if (context == NULL) + return TRUE; + tmp = gdk_drawing_context_get_window (context); if (tmp == NULL) return TRUE; @@ -6964,22 +6968,25 @@ gtk_widget_draw_internal (GtkWidget *widget, if (gdk_cairo_get_clip_rectangle (cr, NULL)) { - GdkWindow *event_window; + GdkWindow *event_window = NULL; gboolean result; gboolean push_group; /* If this was a cairo_t passed via gtk_widget_draw() then we don't - * require a window + * require a window; otherwise we check for the window associated + * to the drawing context and mark it using the clip region of the + * Cairo context. */ - if (gtk_cairo_is_marked_for_draw (cr)) - { - event_window = NULL; - } - else + if (!gtk_cairo_is_marked_for_draw (cr)) { - event_window = gdk_cairo_get_window (cr); - if (event_window != NULL) - gdk_window_mark_paint_from_clip (event_window, cr); + GdkDrawingContext *context = gdk_cairo_get_drawing_context (cr); + + if (context != NULL) + { + event_window = gdk_drawing_context_get_window (context); + if (event_window != NULL) + gdk_window_mark_paint_from_clip (event_window, cr); + } } push_group = -- 2.30.2